#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
#include <time.h>

typedef struct fileContent {
	// 实际文件内容 
	string Content;
} *FileContent;

typedef struct file {
	// 文件名
	string fileName;
	// 文件类型
	string fileType;
	// 文件大小 
	int fileSize;
	// 文件内容指针 
	FileContent fileContent;
	// 文件保护码（index = 0：读权限，index = 1：读权限，index = 2：执行权限；权限位含义：0为禁止，1为允许） 
	char fileProtectCode[3];
	// 创建时间
	time_t createTime;
	// 修改时间 
	time_t updateTime;
	// 访问时间 
	time_t accessTime;
} *File;

// 二级目录：用户文件目录（每个用户的独立文件目录） 
typedef struct uFD {
	// 当前文件
	File file;
	// 上一个文件指针 
	struct uFD *before;
	// 下一个文件指针 
	struct uFD *next;
} *UFD;

typedef struct user {
	// 用户名 
	string username;
	// 密码 
	string password;
	// 用户目录指针 
	UFD ufd;
} *User;

// 一级目录：主文件目录（所有用户和对应用户的相关信息） 
typedef struct mFD {
	// 当前用户
	User user;
	// 上一个用户指针
	struct mFD *before;
	// 下一个用户指针 
	struct mFD *next;
} *MFD;

// 打开文件目录（运行文件目录） 
typedef struct aFD {
	// 当前文件
	File file;
	// 上一个文件指针 
	struct aFD *before;
	// 下一个文件指针 
	struct aFD *next;
} *AFD;

// 初始化一级目录（主文件目录：所有用户和对应用户的相关信息）
void initMFD (MFD &mfd) {
	mfd = new(mFD);
	mfd->user = NULL;
	mfd->before = NULL;
	mfd->next = NULL;
}

// 初始化二级目录（用户文件目录：每个用户的独立文件目录）
void initUFD (UFD &ufd) {
	ufd = new(uFD);
	ufd->file = NULL;
	ufd->before = NULL;
	ufd->next = NULL;	
}

// 初始化打开文件目录（运行文件目录）
void initAFD (AFD &afd) {
	afd = new(aFD);
	afd->file = NULL;
	afd->before = NULL;
	afd->next = NULL;	
}

// 初始化 
void init (MFD &mfd, AFD &afd, User &currentUser) {
	initMFD(mfd);
	initAFD(afd);
	currentUser = NULL;
}

// 创建二级目录（用户文件目录：每个用户的独立文件目录）
UFD createUFD () {
	UFD ufd = new(uFD);
	initUFD(ufd);
	return ufd;
}

// 创建打开文件目录（运行文件目录）
AFD createAFD () {
	AFD afd = new(aFD);
	initAFD(afd);
	return afd;
}

// 判断用户是否存在（已被创建过） 
bool isExistForUser (MFD &mfd, string useranme) {
	MFD tempMFD = mfd->next;
	while (tempMFD != NULL) {
		if (strcmp(tempMFD->user->username.c_str(), useranme.c_str()) == 0) {
			return true;
		}
		tempMFD = tempMFD->next;
	}
	return false;
}

// 创建用户
void createUser (MFD &mfd) {
	cout<<"正在创建新用户......"<<endl;
	string username;
	cout<<"请输入用户名：";
	getline(cin, username);
	cout<<"校验用户存性中......"<<endl;
	if (isExistForUser(mfd, username)) {
		cout<<username + "用户已存在，创建失败！"<<endl;
		return;
	}
	cout<<"用户名“" + username + "”可用！"<<endl;
	string password;
	cout<<"请输入密码：";
	getline(cin, password);
	User newUser = new(user);
	newUser->username = username;
	newUser->password = password;
	newUser->ufd = createUFD();
	MFD newMFDNode = new(mFD);
	newMFDNode->user = newUser;
	MFD tempMFD = mfd;
	while (tempMFD->next != NULL) {
		tempMFD = tempMFD->next;
	}
	tempMFD->next = newMFDNode;
	newMFDNode->before = tempMFD;
	newMFDNode->next = NULL;
	mfd->before = newMFDNode;
	cout<<"创建" + username + "用户成功！"<<endl;
}

// 删除用户
void deleteUser (MFD &mfd) {
	cout<<"正在删除用户......"<<endl;
	if (mfd->next == NULL) {
		cout<<"一级目录（主文件目录：所有用户和对应用户的相关信息）为空！无用户！此操作无效！"<<endl;
		return;
	} else {
		string username;
		string password;
		cout<<"请输入用户名：";
		getline(cin, username);
		cout<<"检索用户中......"<<endl;
		MFD tempMFD = mfd->next;
		do {
			if (strcmp(tempMFD->user->username.c_str(), username.c_str()) == 0) {
				cout<<"正在递归删除" + tempMFD->user->username + "用户的相关信息和所有文件......"<<endl;
				UFD tempUFD = tempMFD->user->ufd;
				while (tempUFD->next != NULL) {
					tempUFD = tempUFD->next;
					delete(tempUFD->before);
					tempUFD->before = NULL;
				}
				delete(tempUFD);
				tempUFD = NULL;
				tempMFD->before->next = tempMFD->next;
				if (tempMFD->next != NULL) {
					tempMFD->next->before = tempMFD->before;
				} else {
					mfd->before = tempMFD->before;
				}
				delete(tempMFD);
				tempMFD = NULL;
				cout<<"删除" + username + "用户成功！"<<endl;
				return;
			}
			tempMFD = tempMFD->next;
		} while (tempMFD != NULL);
		cout<<"没有匹配到相应用户！"<<endl;
		return;
	}
}

// 显示一级目录（主文件目录：所有用户和对应用户的相关信息）
void showMFD (MFD &mfd) {
	cout<<endl;
	cout<<"显示一级目录（主文件目录：所有用户和对应用户的相关信息）:"<<endl;
	if (mfd->next == NULL) {
		cout<<"用户列表为空！无用户！"<<endl;
		return;
	} else {
		cout<<"用户列表："<<endl;
		MFD tempMFD = mfd->next;
		do {
			cout<<"\t" + tempMFD->user->username<<endl;
			tempMFD = tempMFD->next;
		} while (tempMFD != NULL);
	}
}

// 登录 
void loginIn (MFD &mfd, User &currentUser) {
	cout<<"正在登录......"<<endl;
	if (mfd->next == NULL) {
		cout<<"一级目录（主文件目录：所有用户和对应用户的相关信息）为空！无用户！此操作无效！"<<endl;
		return;
	} else {
		string username;
		cout<<"请输入用户名：";
		getline(cin, username);
		cout<<"检索用户中......"<<endl;
		MFD tempMFD = mfd->next;
		do {
			if (strcmp(tempMFD->user->username.c_str(), username.c_str()) == 0) {
				cout<<"用户名“" + username + "”有效！"<<endl;
				string password;
				cout<<"请输入密码：";
				getline(cin, password);
				cout<<"校验密码中......"<<endl;
				if (strcmp(tempMFD->user->password.c_str(), password.c_str()) != 0) {
					cout<<"密码错误！登录失败！"<<endl;
					return;
				}
				currentUser = tempMFD->user;
				cout<<"登录" + currentUser->username + "用户成功！"<<endl;
				cout<<endl;
				return;
			}
			tempMFD = tempMFD->next;
		} while (tempMFD != NULL);
		cout<<"没有匹配到相应用户！"<<endl;
		return;
	}
}

// 登出/注销登录
void loginOut (AFD &afd, User &currentUser) {
	cout<<"正在登出/注销登录......"<<endl;
	if (currentUser == NULL) {
		cout<<"无用户登录！此操作无效！"<<endl;
		return;
	} else {
		cout<<"为确保账户安全、文件信息的一致性，正在关闭已打开的文件......"<<endl;
		AFD tempAFD = afd->next;
		if (tempAFD != NULL) {
			while (tempAFD->next != NULL) {
				tempAFD = tempAFD->next;
				delete(tempAFD->before);
				tempAFD->before = NULL;
			}
			delete(tempAFD);
			tempAFD = NULL;
		}
		afd->before = afd->next = NULL;
		cout<<"已打开的文件已全部关闭！"<<endl;
		currentUser = NULL;
		cout<<"登出/注销登录成功！";
	}
}

// 获取完整文件名（文件名和文件类型） 
string getFileNameWithType (File &file) {
	string fileNameWithType = file->fileName + "." + file->fileType;
	return fileNameWithType;
}

// 判断完整文件名（文件名和文件类型）是否存在（已被创建过） 
bool isExistForFile (UFD &ufd, string fileNameWithType) {
	UFD tempUFD = ufd->next;
	while (tempUFD != NULL) {
		if (strcmp(getFileNameWithType(tempUFD->file).c_str(), fileNameWithType.c_str()) == 0) {
			return true;
		}
		tempUFD = tempUFD->next;
	}
	return false;
}

// 创建文件
void createFile (UFD &ufd) {
	cout<<endl;
	cout<<"正在创建新文件......"<<endl;
	File newFile = new(file);
	cout<<"请输入文件名（不包含文件类型/文件扩展名）：";
	getline(cin, newFile->fileName);
	cout<<"请输入文件类型：";
	getline(cin, newFile->fileType);
	cout<<"校验文件存在性中......"<<endl;
	if (isExistForFile(ufd, getFileNameWithType(newFile))) {
		cout<<newFile->fileName + "." + newFile->fileType + "文件已存在，创建失败！"<<endl;
		return;
	}
	newFile->fileSize = 0;
	newFile->fileContent = new(fileContent);
	newFile->fileContent->Content = "";
	// 设定文件类型如果为exe则文件保护码中可执行位设定为1 
	if (strcmp(newFile->fileType.c_str(), "exe") == 0) {
		strcpy(newFile->fileProtectCode, "111");
	} else {
		strcpy(newFile->fileProtectCode, "110");
	}
	time(&newFile->createTime);
	newFile->updateTime = newFile->createTime;
	newFile->accessTime = newFile->createTime;
	UFD newUFDNode = createUFD();
	newUFDNode->file = newFile;
	UFD tempUFD = ufd;
	while (tempUFD->next != NULL) {
		tempUFD = tempUFD->next;
	}
	tempUFD->next = newUFDNode;
	newUFDNode->before = tempUFD;
	ufd->before = newUFDNode;
	cout<<"创建" + newFile->fileName + "." + newFile->fileType + "文件成功！"<<endl;
}

// 显示二级目录（用户文件目录：每个用户的独立文件目录）
void showUFD (UFD &ufd) {
	cout<<endl;
	cout<<"显示二级目录（用户文件目录：每个用户的独立文件目录）："<<endl;
	if (ufd->next == NULL) {
		cout<<"文件列表为空！无文件！"<<endl;
		return;
	} else {
		cout<<"文件列表："<<endl;
		UFD tempUFD = ufd->next;
		do {
			printf("\t%s.%s\n", tempUFD->file->fileName.c_str(), tempUFD->file->fileType.c_str());
			tempUFD = tempUFD->next;
		} while (tempUFD != NULL);
	}
}

// 详细显示二级目录（用户文件目录：每个用户的独立文件目录）
void showUFDDetail (UFD &ufd) {
	cout<<endl;
	cout<<"详细显示二级目录（用户文件目录：每个用户的独立文件目录）:"<<endl;
	if (ufd->next == NULL) {
		cout<<"文件列表为空！无文件！"<<endl;
		return;
	} else {
		UFD tempUFD = ufd->next;
		do {
			cout<<getFileNameWithType(tempUFD->file) + "文件详情："<<endl;
			cout<<"\t文件名：" + tempUFD->file->fileName<<endl;
			cout<<"\t文件类型：" + tempUFD->file->fileType<<endl;
			printf("\t文件大小：%d\n", tempUFD->file->fileSize);
			printf("\t文件保护码：%s\n", tempUFD->file->fileProtectCode);
			struct tm *lt;
			lt = localtime(&tempUFD->file->createTime);
    		printf ("\t创建时间：%d/%d/%d %d:%d:%d\n",lt->tm_year + 1900, lt->tm_mon + 1, lt->tm_mday, lt->tm_hour, lt->tm_min, lt->tm_sec);
			lt = localtime(&tempUFD->file->updateTime);
			printf ("\t修改时间：%d/%d/%d %d:%d:%d\n",lt->tm_year + 1900, lt->tm_mon + 1, lt->tm_mday, lt->tm_hour, lt->tm_min, lt->tm_sec);
			lt = localtime(&tempUFD->file->accessTime);
			printf ("\t访问时间：%d/%d/%d %d:%d:%d\n",lt->tm_year + 1900, lt->tm_mon + 1, lt->tm_mday, lt->tm_hour, lt->tm_min, lt->tm_sec);
			tempUFD = tempUFD->next;
		} while (tempUFD != NULL);
	}
}

// 显示打开文件目录（运行文件目录）
void showAFD (AFD &afd) {
	cout<<endl;
	cout<<"显示打开文件目录（运行文件目录）："<<endl;
	if (afd->next == NULL) {
		cout<<"已打开文件列表为空！无文件！"<<endl;
		return;
	} else {
		cout<<"已打开文件列表："<<endl;
		AFD tempAFD = afd->next;
		do {
			printf("\t%s.%s\n", tempAFD->file->fileName.c_str(), tempAFD->file->fileType.c_str());
			tempAFD = tempAFD->next;
		} while (tempAFD != NULL);
	}
}

// 详细打开文件目录（运行文件目录）
void showAFDDetail (AFD &afd) {
	cout<<endl;
	cout<<"详细显示打开文件目录（运行文件目录）："<<endl;
	if (afd->next == NULL) {
		cout<<"已打开文件列表为空！无文件！"<<endl;
		return;
	} else {
		AFD tempAFD = afd->next;
		do {
			cout<<getFileNameWithType(tempAFD->file) + "已打开文件详情："<<endl;
			cout<<"\t文件名：" + tempAFD->file->fileName<<endl;
			cout<<"\t文件类型：" + tempAFD->file->fileType<<endl;
			printf("\t文件大小：%d\n", tempAFD->file->fileSize);
			printf("\t文件保护码：%s\n", tempAFD->file->fileProtectCode);
			struct tm *lt;
			lt = localtime(&tempAFD->file->createTime);
    		printf ("\t创建时间：%d/%d/%d %d:%d:%d\n",lt->tm_year + 1900, lt->tm_mon + 1, lt->tm_mday, lt->tm_hour, lt->tm_min, lt->tm_sec);
			lt = localtime(&tempAFD->file->updateTime);
			printf ("\t修改时间：%d/%d/%d %d:%d:%d\n",lt->tm_year + 1900, lt->tm_mon + 1, lt->tm_mday, lt->tm_hour, lt->tm_min, lt->tm_sec);
			lt = localtime(&tempAFD->file->accessTime);
			printf ("\t访问时间：%d/%d/%d %d:%d:%d\n",lt->tm_year + 1900, lt->tm_mon + 1, lt->tm_mday, lt->tm_hour, lt->tm_min, lt->tm_sec);
			tempAFD = tempAFD->next;
		} while (tempAFD != NULL);
	}
}

// 检查读权限 
bool checkReadablePermission (File &file) {
	if (file->fileProtectCode[0] == '1') {
		return true;
	} else {
		return false;
	}
}

// 检查写权限 
bool checkWritablePermission (File &file) {
	if (file->fileProtectCode[1] == '1') {
		return true;
	} else {
		return false;
	}
}

// 检查执行权限 
bool checkExecutablePermission (File &file) {
	if (file->fileProtectCode[2] == '1') {
		return true;
	} else {
		return false;
	}
}

// 判断文件是否打开
File isOpen (AFD &afd, string fileNameWithType) {
	AFD tempAFD = afd->next;
	while (tempAFD != NULL) {
		if (strcmp(getFileNameWithType(tempAFD->file).c_str(), fileNameWithType.c_str()) == 0) {
			return tempAFD->file;
		}
		tempAFD = tempAFD->next;
	}
	return NULL;
}

// 删除文件
void deleteFile (UFD &ufd, AFD &afd) {
	cout<<endl;
	cout<<"删除文件中......"<<endl;
	if (ufd->next == NULL) {
		cout<<"二级目录（用户文件目录：每个用户的独立文件目录）为空！无文件！此操作无效！"<<endl;
		return;
	} else {
		string fileNameWithType;
		cout<<"请输入要删除的文件（格式：文件名.文件类型）："; 
		getline(cin, fileNameWithType);
		cout<<"检索文件中......"<<endl;
		if (isOpen(afd, fileNameWithType)) {
			cout<<"此文件已打开，不可删除！"<<endl;
			return;
		}
		UFD tempUFD = ufd->next;
		do {
			if (strcmp(getFileNameWithType(tempUFD->file).c_str(), fileNameWithType.c_str()) == 0) {
				cout<<"已匹配到对应文件，正在删除......"<<endl;
				if (!checkWritablePermission(tempUFD->file)) {
					cout<<"权限不足，该文件不可删除！"<<endl;
					return;
				}
				tempUFD->before->next = tempUFD->next;
				if (tempUFD->next != NULL) {
					tempUFD->next->before = tempUFD->before;
				} else {
					ufd->before = tempUFD->before;
				}
				delete(tempUFD);
				tempUFD = NULL;
				cout<<"删除" + fileNameWithType + "文件成功！"<<endl;
				return;
			}
			tempUFD = tempUFD->next;
		} while (tempUFD != NULL);
		cout<<"没有匹配到相应文件！"<<endl;
		return;
	}
}

// 打开文件（加载到内存中） 
void openFile (UFD &ufd, AFD &afd) {
	cout<<endl;
	cout<<"打开文件中（加载到内存中）......"<<endl;
	if (ufd->next == NULL) {
		cout<<"二级目录（用户文件目录：每个用户的独立文件目录）为空！无文件！此操作无效！"<<endl;
		return;
	} else {
		string fileNameWithType;
		cout<<"请输入要打开/执行的文件（格式：文件名.文件类型）："; 
		getline(cin, fileNameWithType);
		cout<<"检索文件中......"<<endl;
		if (isOpen(afd, fileNameWithType)) {
			cout<<"此文件已打开（已加载至内存中），无需再次打开！"<<endl;
			return;
		} else {
			UFD tempUFD = ufd->next;
			do {
				if (strcmp(getFileNameWithType(tempUFD->file).c_str(), fileNameWithType.c_str()) == 0) {
					cout<<"已匹配到对应文件，正在打开......"<<endl;
					if (!checkReadablePermission(tempUFD->file) && checkWritablePermission(tempUFD->file) && !checkExecutablePermission(tempUFD->file)) {
						cout<<"权限不足，该文件不可打开（加载到内存中）！"<<endl;
						return;
					}
					AFD newAFDNode = createAFD();
					newAFDNode->file = tempUFD->file;
					AFD tempAFD = afd;
					while (tempAFD->next != NULL) {
						tempAFD = tempAFD->next;
					}
					tempAFD->next = newAFDNode;
					newAFDNode->before = tempAFD;
					afd->before = newAFDNode;
					cout<<"打开（加载到内存中）" + fileNameWithType + "文件成功！"<<endl;
					return;
				}
				tempUFD = tempUFD->next;
			} while (tempUFD != NULL);
			cout<<"没有匹配到相应文件！"<<endl;
			return;
		}
	}
}

// 关闭文件
void closeFile (UFD &ufd, AFD &afd) {
	cout<<endl;
	cout<<"关闭文件中......"<<endl;
	if (ufd->next == NULL) {
		cout<<"二级目录（用户文件目录：每个用户的独立文件目录）为空！无文件！此操作无效！"<<endl;
		return;
	} else {
		string fileNameWithType;
		cout<<"请输入要关闭的文件（格式：文件名.文件类型）："; 
		getline(cin, fileNameWithType);
		cout<<"检索文件中......"<<endl;
		AFD tempAFD = afd->next;
		while (tempAFD != NULL) {
			if (strcmp(getFileNameWithType(tempAFD->file).c_str(), fileNameWithType.c_str()) == 0) {
				tempAFD->before->next = tempAFD->next;
				if (tempAFD->next != NULL) {
					tempAFD->next->before = tempAFD->before;
				} else {
					afd->before = tempAFD->before;
				}
				delete(tempAFD);
				tempAFD = NULL;
				cout<<"关闭" + fileNameWithType + "文件成功！"<<endl;
				return;
			}
			tempAFD = tempAFD->next;
		}
		cout<<"此文件未打开，无需关闭！"<<endl;
		return;
	}
}

// 读文件
void readFile (UFD &ufd, AFD &afd) {
	cout<<endl;
	cout<<"读文件中......"<<endl;
	if (ufd->next == NULL) {
		cout<<"二级目录（用户文件目录：每个用户的独立文件目录）为空！无文件！此操作无效！"<<endl;
		return;
	} else {
		string fileNameWithType;
		cout<<"请输入要读取的文件（格式：文件名.文件类型）："; 
		getline(cin, fileNameWithType);
		cout<<"正在检索文件中......"<<endl;
		File file = isOpen(afd, fileNameWithType);
		if (!file) {
			cout<<"没有匹配到相应文件（此文件还未打开，请先打开该文件再读！）"<<endl;
			return;
		}
		cout<<"已匹配到对应文件，正在尝试读......"<<endl;
		if (!checkReadablePermission(file)) {
			cout<<"权限不足，该文件不可读！"<<endl;
			return;
		}
		// 修改文件访问时间 
		time(&file->accessTime);
		cout<<"读" + fileNameWithType + "文件成功！"<<endl;
		if (file->fileSize == 0) {
			cout<<"文件内容：(无文件内容)" + file->fileContent->Content<<endl;	
		} else {
			cout<<"文件内容：" + file->fileContent->Content<<endl;
		}
		return;
	}
}

// 写文件
void writeFile (UFD &ufd, AFD &afd) {
	cout<<endl;
	cout<<"写文件中......"<<endl;
	if (ufd->next == NULL) {
		cout<<"二级目录（用户文件目录：每个用户的独立文件目录）为空！无文件！此操作无效！"<<endl;
		return;
	} else {
		string fileNameWithType;
		cout<<"请输入要写入的文件（格式：文件名.文件类型）："; 
		getline(cin, fileNameWithType);
		cout<<"正在检索文件中......"<<endl;
		File file = isOpen(afd, fileNameWithType);
		if (!file) {
			cout<<"没有匹配到相应文件（此文件还未打开，请先打开该文件再写！）"<<endl;
			return;
		}
		cout<<"已匹配到对应文件"<<endl;
		if (!checkWritablePermission(file)) {
			cout<<"权限不足，该文件不可写！"<<endl;
			return;
		}
		cout<<"请输入要写入的文件内容（按回车确定内容即写入）：";
		string  fileContent;
		getline(cin, fileContent);
		cout<<"保存中，正在尝试写入......"<<endl;
		file->fileSize = fileContent.length();
		file->fileContent->Content = fileContent;
		time(&file->updateTime);
		// 修改文件更新时间 
		time(&file->updateTime);
		cout<<"写入" + fileNameWithType + "文件成功！"<<endl;
		return;
	}
}

// 运行 
void run (MFD &mfd, AFD &afd, User &currentUser) {
	string choice1;
	string choice2;
	while (true) {
		cout<<"请选择操作：1、创建新用户    2、删除用户    3、显示所有用户    4、登录    5、结束程序"<<endl;
		cout<<"直接输入操作选项前面对应数字即可：";
		getline(cin, choice1);
		while (strcmp(choice1.c_str(), "1") != 0 && strcmp(choice1.c_str(), "2") != 0 && strcmp(choice1.c_str(), "3") != 0 && strcmp(choice1.c_str(), "4") != 0 && strcmp(choice1.c_str(), "5") != 0){
			cout<<"非法输入！请重新输入！"<<endl;
			cout<<"直接输入操作选项前面对应数字即可：";
			getline(cin, choice1);
		}
		if (strcmp(choice1.c_str(), "1") == 0) {
			createUser(mfd);
		} else if (strcmp(choice1.c_str(), "2") == 0) {
			deleteUser(mfd);
		} else if (strcmp(choice1.c_str(), "3") == 0) {
			showMFD(mfd);
		} else if (strcmp(choice1.c_str(), "4") == 0) {
			loginIn(mfd, currentUser);
			while (currentUser) {
				cout<<"请选择操作：1、创建新文件    2、删除文件    3、打开文件    4、关闭文件    5、读文件    6、写文件    7、显示所有文件    8、详细显示所有文件信息    9、显示已打开的文件    10、详细显示已打开的文件的信息    11、登出/注销登录"<<endl;
				cout<<"直接输入操作选项前面对应数字即可：";
				getline(cin, choice2);
				while (strcmp(choice2.c_str(), "1") != 0 && strcmp(choice2.c_str(), "2") != 0 && strcmp(choice2.c_str(), "3") != 0 && strcmp(choice2.c_str(), "4") != 0 && strcmp(choice2.c_str(), "5") != 0 && strcmp(choice2.c_str(), "6") != 0 && strcmp(choice2.c_str(), "7") != 0 && strcmp(choice2.c_str(), "8") != 0 && strcmp(choice2.c_str(), "9") != 0 && strcmp(choice2.c_str(), "10") != 0 && strcmp(choice2.c_str(), "11") != 0){
					cout<<"非法输入！请重新输入！"<<endl;
					cout<<"直接输入操作选项前面对应数字即可：";
					getline(cin, choice2);
				}
				if (strcmp(choice2.c_str(), "1") == 0) {
					createFile(currentUser->ufd);       
				} else if (strcmp(choice2.c_str(), "2") == 0) {
					deleteFile(currentUser->ufd, afd);
				} else if (strcmp(choice2.c_str(), "3") == 0) {
					openFile(currentUser->ufd, afd);
				} else if (strcmp(choice2.c_str(), "4") == 0) {
					closeFile(currentUser->ufd, afd);
				} else if (strcmp(choice2.c_str(), "5") == 0) {
					readFile(currentUser->ufd, afd);
				} else if (strcmp(choice2.c_str(), "6") == 0) {
					writeFile(currentUser->ufd, afd);
				} else if (strcmp(choice2.c_str(), "7") == 0) {
					showUFD(currentUser->ufd);
				} else if (strcmp(choice2.c_str(), "8") == 0) {
					showUFDDetail(currentUser->ufd);
				} else if (strcmp(choice2.c_str(), "9") == 0) {
					showAFD(afd);
				} else if (strcmp(choice2.c_str(), "10") == 0) {
					showAFDDetail(afd);
				} else if (strcmp(choice2.c_str(), "11") == 0) {
					loginOut(afd, currentUser);
				}
				cout<<endl;
			}
		} else if (strcmp(choice1.c_str(), "5") == 0) {
			break;
		}
		cout<<endl;	
	}
}

int main() {
	cout<<"文件系统模拟演示开始！\n"<<endl;
	cout<<"初始化中......"<<endl;
	MFD mfd;
	AFD afd;
	User currentUser;
	init(mfd, afd, currentUser);
	cout<<"初始化完毕！\n"<<endl;
	run(mfd, afd, currentUser);
	cout<<"\n文件系统模拟演示结束！"<<endl;
	return 0;
}
